home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Whiteline: delta
/
whiteline CD Series - delta.iso
/
progtool
/
modula2
/
module
/
popupmen.mod
< prev
next >
Wrap
Text File
|
1995-11-25
|
7KB
|
195 lines
IMPLEMENTATION MODULE PopUpMenue;
FROM SYSTEM IMPORT TSIZE,ADDRESS,VAL,ADR;
FROM EasyDialog IMPORT GetObjectXYWH,SetObjectXYWH,and,WorkTree,TreePROC;
FROM Strings IMPORT RightStr,EqualStr,Concat,Length;
FROM KbdEvnt IMPORT ConcatScanString;
FROM BitBlt IMPORT CopyScreenToMem,CopyMemToScreen;
FROM AES IMPORT ObjectFind,ObjectDraw,ObjectChange,EventMultiple,
WindowGet,GrafMouse;
FROM GEMAESBase IMPORT Object,Disabled,Selected,Checked,GraphicString,
WorkXYWH,MouseOff,MouseOn,ButtonEvent,KeyboardEvent,
TimerEvent;
VAR MenuString,ScanString : ARRAY [0..7] OF CHAR;
Item,Laenge : INTEGER;
PROCEDURE GetObjectState(Index:INTEGER; TreePtr:ADDRESS):INTEGER;
VAR Probe :POINTER TO Object;
BEGIN
Probe:=TreePtr+VAL(ADDRESS, (Index*TSIZE(Object)));
RETURN Probe^.state;
END GetObjectState;
PROCEDURE PopUpMenuItemCheck(Tree : ADDRESS; Item :INTEGER; Check :BOOLEAN);
(* Display or erase a check mark next to a menu item *)
VAR x,y,w,h :CARDINAL;
BEGIN
GetObjectXYWH(0,Tree,x,y,w,h);
IF Check THEN
IF ~and(GetObjectState(Item,Tree),Checked) THEN
ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)+Checked,0);
END(*IF*);
ELSE
IF and(GetObjectState(Item,Tree),Checked) THEN
ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)-Checked,0);
END(*IF*);
END(*IF*);
END PopUpMenuItemCheck;
PROCEDURE PopUpMenuItemEnable (Tree: ADDRESS; Item:INTEGER; Enable: BOOLEAN);
(* Enables or disables a menu item *)
VAR x,y,w,h :CARDINAL;
BEGIN
GetObjectXYWH(0,Tree,x,y,w,h);
IF ~Enable THEN
IF ~and(GetObjectState(Item,Tree),Disabled) THEN
ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)+Disabled,0);
END(*IF*);
ELSE
IF and(GetObjectState(Item,Tree),Disabled) THEN
ObjectChange(Tree,Item,0,x,y,w,h,GetObjectState(Item,Tree)-Disabled,0);
END(*IF*);
END(*IF*);
END PopUpMenuItemEnable;
PROCEDURE PopUpMenuText (Tree: ADDRESS; Item: INTEGER; Text: ARRAY OF CHAR);
(* Changes the text of a menu item *)
(* funktioniert nur nicht so wie ich mir das vorstellte ! *)
VAR i : INTEGER;
Probe : POINTER TO Object;
s : POINTER TO ARRAY [0..40] OF CHAR;
BEGIN
Probe:=Tree+VAL(ADDRESS, (Item*TSIZE(Object)));
IF Probe^.type=GraphicString THEN
s:= Probe^.spec;
IF HIGH(Text)>39 THEN
FOR i:=0 TO 39 DO
s^[i]:=Text[i];
END(*FOR*);
s^[40]:=0C;
ELSE
FOR i:=0 TO HIGH(Text) DO
s^[i]:=Text[i];
END(*FOR*);
s^[HIGH(Text)]:=0C;
END(*IF*);
END(*IF*);
END PopUpMenuText;
PROCEDURE SearchPopMenuTree(MenuTree:ADDRESS; Index :INTEGER);
VAR
MenuObject : POINTER TO Object;
s : POINTER TO ARRAY [0..40] OF CHAR;
OK : BOOLEAN;
BEGIN
s:=ADR(MenuString);
MenuObject:=MenuTree+ VAL(ADDRESS,(Index*TSIZE(Object)));
IF (MenuObject^.type=GraphicString) AND ~and(MenuObject^.state,Disabled) THEN
s:=MenuObject^.spec;
RightStr(s^,Laenge,MenuString,OK);
IF OK AND EqualStr(ScanString,MenuString)THEN
Item:=Index;
END(*IF*);
END(*IF*);
END SearchPopMenuTree;
PROCEDURE UpDate(Tree :ADDRESS;Last,new :INTEGER);
VAR x,y,w,h :CARDINAL;
BEGIN
GetObjectXYWH(0,Tree,x,y,w,h);
IF Last>0 THEN
IF ~and(GetObjectState(Last,Tree),Disabled)
AND and(GetObjectState(Last,Tree),Selected) THEN
ObjectChange(Tree,Last,0,x-1,y-1,w+4,h+4,GetObjectState(Last,Tree)-Selected,1);
END(*IF*);
END(*IF*);
IF new>0 THEN
IF ~and(GetObjectState(new,Tree),Disabled)
AND ~and(GetObjectState(new,Tree),Selected) THEN
ObjectChange(Tree,new,0,x-1,y-1,w+4,h+4,GetObjectState(new,Tree)+Selected,1);
END(*IF*);
END(*IF*);
END UpDate;
PROCEDURE PopUp(x,y:INTEGER; PopTree :ADDRESS ) : INTEGER;
VAR dx,dy,dw,dh : CARDINAL;
wx,wy,ww,wh : INTEGER;
Akt,Last,MouseX,MouseY,Keystate,
Scancode,Mouseclicks :INTEGER;
Buffer : ADDRESS;
MsgBuf : ARRAY [0..7] OF INTEGER;
Clicks,event,Mousebutton : INTEGER;
search :TreePROC;
BEGIN
search:=SearchPopMenuTree;
GetObjectXYWH(0,PopTree,dx,dy,dw,dh);
WindowGet(0,WorkXYWH,wx,wy,ww,wh);
(* Wenn das Objekt nicht komplett auf den Bildschirm passt *)
(* werden die Koordinaten x,y so verschoben das es vollständig *)
(* darstellbar ist *)
IF (wx+ww)<(x+VAL(INTEGER,dw)) THEN
x:=(wx+ww)-VAL(INTEGER,dw);
END(*IF*);
IF (wy+wh)<(y+VAL(INTEGER,dh)) THEN
y:=(wy+wh)-VAL(INTEGER,dh);
END(*IF*);
SetObjectXYWH(0,PopTree,x,y,dw,dh);
(* Bildschirmhintergrund retten für Redraw *)
GrafMouse(MouseOff,NIL);
CopyScreenToMem(x-2,y-2,dw+6,dh+6,Buffer);
ObjectDraw(PopTree,0,8,x-1,y-1,dw+4,dh+4);
GrafMouse(MouseOn,NIL);
Last:=0;Akt:=0;
REPEAT
event:= EventMultiple(ButtonEvent+KeyboardEvent+TimerEvent,
01,03,01, (* wartet auf Mausclicks *)
0,0,0,0,0,0,0,0,0,0,
ADR(MsgBuf),(* hier bedeutungslos *)
50,0, (* alle 50 ms wird die neue Position der Maus abgefragt *)
MouseX,MouseY,
Mousebutton,Keystate,Scancode,Mouseclicks);
Last:= Akt;
(* Wo ist die Maus ?*)
Akt:=ObjectFind(PopTree,0,8,MouseX,MouseY);
IF event = KeyboardEvent THEN (* Tastaturunterstützung in PopupMenüs sieht genauso aus wie in normalen Menüs *)
MenuString:=' ';ScanString:=' ';
ConcatScanString(ScanString,Keystate,Scancode);
Item:= -1;
Laenge:=Length(ScanString);
WorkTree(PopTree,0,0,search);
(* Wenn Shortcut gefunden dann anclicken des Menüeintrages simulieren*)
IF Item >0 THEN
event:=ButtonEvent;
Mouseclicks:=1;
Mousebutton:=1;
Akt:= Item;
END(*IF*);
END(*IF*);
IF Last # Akt THEN
UpDate(PopTree,Last,Akt);
END(*IF*);
UNTIL (event=ButtonEvent) AND (Mouseclicks>0) AND (Mousebutton>0);
UpDate(PopTree,Akt,0);
GrafMouse(MouseOff,NIL);
(* Bildschirmhintergrund wieder herstellen *)
CopyMemToScreen(x-2,y-2,dw+6,dh+6,Buffer,TRUE);
GrafMouse(MouseOn,NIL);
IF ~and(GetObjectState(Akt,PopTree),Disabled) THEN
RETURN Akt;
ELSE
RETURN -1
END(*IF*);
END PopUp;
END PopUpMenue.